package frame.ddd;

import frame.ddd.lessmodel.Item;
import frame.ddd.lossmodel.ItemDao;
import frame.ddd.lossmodel.basic.Bid;
import frame.ddd.lossmodel.basic.BusinessException;
import frame.ddd.lossmodel.basic.MonetaryAmount;
import frame.ddd.lossmodel.basic.User;

import java.util.Collection;

/**
 * desc     : 贫血模型
 *            简单来说，就是domain ojbect包含了不依赖于持久化的领域逻辑，而那些依赖持久化的领域逻辑被分离到Service层
 *            Service(业务逻辑，事务封装) --> DAO ---> domain object
 *
 * 　　这也就是Martin Fowler指的rich domain object。
 *
 * 　　一个带有业务逻辑的实体类，即domain object是Item。
 *
 * 　　一个DAO接口ItemDao。
 *
 * 　　一个DAO实现ItemDaoHibernateImpl。
 *
 * 　　一个业务逻辑对象ItemManager。
 *
 *
 *      在第二种模型中，placeBid业务逻辑是放在Item中实现的，而loadItemById和findAll业务逻辑是放在ItemManager
 *      中实现的。不过值得注意的是，即使placeBid业务逻辑放在Item中，你仍然需要在ItemManager中简单的封装一层，
 *      以保证对placeBid业务逻辑进行事务的管理和持久化的触发
 *
 * dateTime : 2020/8/6 19:30
 *
 * @author cww
 */

public class ItemManager {
    private ItemDao itemDao;
    public void setItemDao(ItemDao itemDao) { this.itemDao = itemDao;}
    public Bid loadItemById(Long id) {
        itemDao.loadItemById(id);
        return null;
    }
    public Collection listAllItems() {
        return   itemDao.findAll();
    }
    public Bid placeBid(Item item, User bidder, MonetaryAmount bidAmount,
                        Bid currentMaxBid, Bid currentMinBid) throws BusinessException {
        item.placeBid(bidder, bidAmount, currentMaxBid, currentMinBid);
        itemDao.update(item);     // 必须显式的调用DAO，保持持久化
        return null;
    }
}
